home *** CD-ROM | disk | FTP | other *** search
- /*
- ** James "im" Beninghaus
- */
-
- #include <QuickDraw.h>
- #include <Devices.h>
- #include <stdio.h>
- #include <string.h>
-
- #include <MacTCPCommonTypes.h>
- #include <AddressXlation.h>
- #include <GetMyIPAddr.h>
- #include <TCPPB.h>
- #include <UDPPB.h>
-
- #define _STORAGE_ true
- #include <TCP.h>
-
- main (int argc, char *argv[]) {
-
- auto OSErr osErr = noErr;
- auto short index;
- auto char *option;
- auto char *parameter;
- auto char *address;
- auto char *text;
- auto TCPNotifyProc asrProc = nil;
- auto TCPiopb pb;
- auto StreamPtr stream;
- auto char streamBuf[4096];
- auto long streamBufLen = sizeof(streamBuf);
- auto Ptr streamBufPtr;
- auto ip_addr localIP = cAnyIP;
- auto ip_port localPort = cAnyPort;
- auto ip_addr remoteIP = cAnyIP;
- auto ip_port remotePort = cReceivePort;
- auto WDS(1) wds;
-
- InitGraf((Ptr) &qd.thePort);
-
- if (argc > 1) {
- index = 1;
- while (index < argc) {
-
- option = argv[index++];
- parameter = argv[index++];
-
- if ('-' != option[0] || (! strchr("atn", option[1])) || index > argc) {
- printf("TCPSend -a ipAddress -t text [-n]");
- exit(paramErr);
- } else {
- switch (option[1]) {
- case 'a' :
- address = parameter;
- break;
- case 't' :
- text = parameter;
- break;
- case 'n' :
- asrProc = ASR;
- index--;
- break;
- }
- }
- }
- }
-
- osErr = _TCPInit();
- if (noErr == osErr) {
- osErr = _TCPCreate(&pb, &stream, streamBuf, streamBufLen, (TCPNotifyProc) asrProc, (Ptr) nil, (TCPIOCompletionProc) nil, false);
- if (noErr == osErr) {
- osErr = TCPDotAddress(address, &remoteIP);
- if (noErr == osErr) {
- osErr = _TCPActiveOpen(&pb, stream, remoteIP, remotePort, &localIP, &localPort, (Ptr) nil, (TCPIOCompletionProc) nil, false);
- if (noErr == osErr) {
-
- /* send data to the remote host */
- wds.block[0].ptr = text;
- wds.block[0].length = strlen(text) + 1;
- wds.zero = nil;
- osErr = _TCPSend(&pb, stream, (wdsEntry *) &wds, (Ptr) nil, (TCPIOCompletionProc) nil, false);
-
- osErr = _TCPClose(&pb, stream, nil, (TCPIOCompletionProc) nil, false);
- }
- }
- }
- osErr = _TCPRelease(&pb, stream, &streamBufPtr, &streamBufLen, (TCPIOCompletionProc) nil, false);
- }
- exit(osErr);
- }
-
-
- pascal void StrToAddrResultProc(aHostInfo, userdata) /* utility routine for StrToAddr */
- struct hostInfo *aHostInfo;
- Ptr userdata;
- {
- /* simply watch the aHostInfo.rtnCode! */
- }
-
- OSErr TCPDotAddress(char *dotAddress, ip_addr *ipAddress) {
- auto OSErr osErr;
- auto struct hostInfo aHostInfo; /* a data structure for the DNR function */
-
- osErr = OpenResolver((char *) 0);
- if (osErr) {
- return osErr;
- }
-
- /* ask the DNR function to get the IP address */
- StrToAddr(dotAddress, &aHostInfo, (ResultProcPtr) StrToAddrResultProc, (Ptr) 0);
-
- /* wait for the address information or some error other than cacheFault to occur */
- while (cacheFault == aHostInfo.rtnCode)
- ;
-
- osErr = CloseResolver();
- if (osErr) {
- return osErr;
- }
-
- /* if it was an error there isn't much more we can do here but let the caller know */
- if (noErr != aHostInfo.rtnCode) {
- osErr = aHostInfo.rtnCode;
- return osErr;
- }
-
- /* use the first IP address for this host */
- *ipAddress = aHostInfo.addr[0];
-
- return osErr;
- }
-